undefined 与 null
1 | typeof(undefined); //undefined |
作用域和作用域链
作用域
js中,作用域只有两个:全局作用域和函数作用域,无块级作用域。作用域链
当代码在一个环境中执行时,会创建变量的作用域链。作用域链的用途,是保证对执行环境有权访问的所有变量和函数的==有序访问==。作用域链的前端,始终都是当前执行的代码所在环境的变量对象,下一个变量对象来自包含(外部)环境,在下一个对象则来自下一个包含环境,这样,一直延续到全局环境。全局执行环境的变量对象始终都是作用域链中的最后一个对象。
this
this 是函数内部的对象,引用的是函数执行环境的对象,当在网页的全局作用域中调用函数时,this对象引用的就是window,当函数作为某个对象的方法调用时,this等于那个对象。
1 | var name = "name"; |
apply call bind
每个函数都包含两个非继承而来的方法:apply() 和 call()。它们的用途都是在特定的作用域种调用函数,实际上等于设置==函数体内的this对象==的值。
1 | function sum(num1, num2) { |
1 | function sum(num1, num2) { |
call() 与 apply() 能==扩充函数作用域==
1 | window.color = "red"; |
使用call() 与 apply() 扩充作用域,对象不需与方法有任何耦合的关系
1 | window.color = "red"; |
forEach map reduce
该方法为==数组方法==。其中forEach() 和 map() 为迭代方法,接收三个参数:数组项的值、该项在数组中的位置和数组对象本身。
1 | var num = [1, 2, 3, 4, 5]; |
1 | var num = [1, 2, 3, 4, 5]; |
reduce()
reduce() 为归并数组的方法,从数组的第一项开始,逐个遍历到最后,然后构建一个最终返回的值。该方法接收四个参数:前一个值、当前值、项的索引和数组对象。函数返回的任何值都会作为第一个参数自动传递给下一项。
1 | var num = [1, 2, 3, 4, 5]; |
函数柯里化
函数柯里化用于创建已经设置好了一个或多个参数的函数,基本方法是使用闭包返回一个函数,当函数被调用时,返回的函数还需设置一些传入参数。
柯里化动态创建步骤:调用另一个函数并为它传入要柯里化的函数和必要参数。
1 | function curry(fn) { |